package com.olap.starter.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.olap.starter.core.base.BaseService;
import com.olap.starter.mapper.TableGroupHeaderConfigMapper;
import com.olap.starter.pojo.TableConfig;
import com.olap.starter.pojo.TableConfigColumn;
import com.olap.starter.pojo.TableGroupHeaderConfig;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.util.*;

/**
 * <p>
 * 分组表头配置 服务实现类
 * </p>
 *
 * @author WBG
 * @since 2024-08-06
 */
@Service
@DS("online")
public class TableGroupHeaderConfigServices extends BaseService<TableGroupHeaderConfigMapper, TableGroupHeaderConfig> {

    public void saveList(List<TableConfigColumn> list, Map<String, Object> map, Long id, TableConfig tableConfig) {
        for (TableConfigColumn config : list) {
            // 有子字段
            if (!CollectionUtils.isEmpty(config.getChildren())) {
                TableGroupHeaderConfig headerConfig = new TableGroupHeaderConfig();
                headerConfig.setUuid(tableConfig.getUuid());
                headerConfig.setTableConfigId(tableConfig.getUuid());
                headerConfig.setTheme(tableConfig.getTheme());
                BeanUtils.copyProperties(config, headerConfig);
                if (!ObjectUtils.isEmpty(config.getId())) {
                    headerConfig.setId(Long.valueOf(config.getId()));
                }
                if (!ObjectUtils.isEmpty(id)) {
                    headerConfig.setParentId(id);
                }
                // 根据id保存或更新
                this.saveOrUpdate(headerConfig);
                saveList(config.getChildren(), map, headerConfig.getId(), tableConfig);
            }
            if (!ObjectUtils.isEmpty(id) && CollectionUtils.isEmpty(config.getChildren())) {
                map.put(config.getField(), id);
            }
        }
    }
    private static boolean hasColumn = false;

    public List<TableConfigColumn> getGroupHeaderTitle(List<TableConfigColumn> configColumns) {
        if (CollectionUtils.isEmpty(configColumns)) {
            return configColumns;
        }
        List<TableConfigColumn> columns = new ArrayList<>();
        Map<String, TableConfigColumn> configColMap = new HashMap<>();
        for (TableConfigColumn configColumn : configColumns) {
            TableConfigColumn column = configColMap.get(configColumn.getParentFieldId());
            if (!StringUtils.hasText(configColumn.getParentFieldId())) {
                if (!CollectionUtils.isEmpty(configColMap)) {
                    for (TableConfigColumn configCol : configColMap.values()) {
                        columns.add(configCol);
                    }
                    configColMap = new HashMap<>();
                }
                columns.add(configColumn);
                continue;
            }
            if (org.springframework.util.ObjectUtils.isEmpty(column)) {
                hasColumn = false;
                setChildrenColumn(configColMap.values(), configColumn);
                if (hasColumn) {
                    continue;
                }
                TableConfigColumn configCol = getTableColumn(configColumn, configColMap);
                if (!org.springframework.util.ObjectUtils.isEmpty(configCol)) {
                    configColMap.put(configColumn.getParentFieldId(), configCol);
                }
                continue;
            }
            List<TableConfigColumn> children = column.getChildren();
            setColumn(children, configColumn);
            column.setChildren(children);
        }
        return columns;
    }
    /**
     * 添加分组表头标题
     * @param configColumns
     * @param configColumn
     */
    private void setColumn(List<TableConfigColumn> configColumns, TableConfigColumn configColumn) {
        for (TableConfigColumn column : configColumns) {
            if (column.getParentFieldId().equals(configColumn.getParentFieldId())) {
                configColumns.add(configColumn);
                return;
            }
            if (!CollectionUtils.isEmpty(column.getChildren())) {
                setColumn(column.getChildren(), configColumn);
            }
        }
    }
    /**
     * 获取分组表头配置
     * @param column
     * @param map
     * @return
     */
    private TableConfigColumn getTableColumn(TableConfigColumn column, Map<String, TableConfigColumn> map) {
        TableConfigColumn configCol = new TableConfigColumn();
        BeanUtils.copyProperties(column, configCol);
        TableGroupHeaderConfig groupConfigCol = this.getById(column.getParentFieldId());// 11 9 5
        if (!org.springframework.util.ObjectUtils.isEmpty(groupConfigCol)) {
            configCol.setField(groupConfigCol.getField());
            configCol.setTitle(groupConfigCol.getTitle());
            configCol.setLabel(groupConfigCol.getTitle());
            configCol.setId(groupConfigCol.getId());
            List<TableConfigColumn> arr = new ArrayList<>();
            arr.add(column);
            configCol.setChildren(arr);
            // 有父级
            if (!org.springframework.util.ObjectUtils.isEmpty(groupConfigCol.getParentId())) {
                // 判断是否已经获取过父级
                configCol.setParentFieldId(groupConfigCol.getParentId().toString());
                setChildrenColumn(map.values(), configCol);
                if (hasColumn) {
                    return null;
                }
                return getTableColumn(configCol, map);
            }
        }
        return configCol;
    }
    /**
     * 设置分组表头子标题
     * @param configColumns
     * @param configColumn
     */
    private void setChildrenColumn(Collection<TableConfigColumn> configColumns, TableConfigColumn configColumn) {
        for (TableConfigColumn column : configColumns) {
            if (String.valueOf(column.getId()).equals(configColumn.getParentFieldId())) {
                column.getChildren().add(configColumn);
                hasColumn = true;
                return;
            }
            if (!CollectionUtils.isEmpty(column.getChildren())) {
                setChildrenColumn(column.getChildren(), configColumn);
            }
        }
    }
}
